﻿using BLevy.Entidad;
using BLevy.Negocio;
using BLevy.UI.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmUsuarios : Form
    {
        private int usuario_id;
        private string operacion;

        public frmUsuarios()
        {
            InitializeComponent();
        }

        public frmUsuarios(int _id, string _operacion)
        {
            InitializeComponent();

            usuario_id = _id;
            operacion = _operacion;
        }

        private void IniciarControles()
        {
            txtApellido.Text = string.Empty;
            txtDocumento.Text = string.Empty;
            txtNombre.Text = string.Empty;
            txtPass.Text = string.Empty;
            txtUsuario.Text = string.Empty;
            ckbActivo.CheckState = CheckState.Checked;
        }

        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            FindRoles();

            if (string.IsNullOrEmpty(operacion))
            {
                IniciarControles();
            }
            else
            {
                FindUsuario(usuario_id);
            }
        }

        private void FindRoles()
        {
            try
            {
                cmbRol.ValueMember = "id";
                cmbRol.DisplayMember = "rol";
                cmbRol.DataSource = Roles.FindAll();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FindUsuario(int usuarioId)
        {
            try
            {
                Usuario usuario = Usuarios.FindById(usuarioId);

                txtApellido.Text = usuario.apellido;
                txtDocumento.Text = usuario.documento;
                txtNombre.Text = usuario.nombres;
                txtPass.Text = usuario.password;
                txtUsuario.Text = usuario.usuario;
                ckbActivo.Checked = Convert.ToBoolean(usuario.activo);

                usuario.rol = Roles.FindById(usuario.rol_id);
                cmbRol.Text = usuario.rol.rol;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        Boolean ValidarForm()
        {
            error.Clear();
            bool resultado = true;

            if (string.IsNullOrEmpty(txtDocumento.Text))
            {
                resultado = false;
                error.SetError(txtDocumento, "Debe completar el campo Documento.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtApellido.Text))
            {
                resultado = false;
                error.SetError(txtApellido, "Debe completar el campo Apellido.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtNombre.Text))
            {
                resultado = false;
                error.SetError(txtNombre, "Debe completar el campo Nombres.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtUsuario.Text))
            {
                resultado = false;
                error.SetError(txtDocumento, "Debe completar el campo Usuario.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtPass.Text))
            {
                resultado = false;
                error.SetError(txtPass, "Debe completar el campo Contraseña.");
                return resultado;
            }

            return resultado;
        }

        private void txtDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtDocumento, "Solo se permiten números en el campo Documento.");
                e.Handled = true;
                return;
            }
        }


        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarForm() == true)
            {
                if (string.IsNullOrEmpty(operacion))
                {
                    RegistrarUsuario();
                }
                else
                {
                    ModificarUsuario();
                }
            }
        }

        private void RegistrarUsuario()
        {
            try
            {
                Loguear UL = new Loguear();

                Usuario usuario = new Usuario();
                usuario.activo = Convert.ToInt32(ckbActivo.Checked);
                usuario.apellido = txtApellido.Text;
                usuario.documento = txtDocumento.Text;
                usuario.nombres = txtNombre.Text;
                usuario.password = UL.SHA1Encrypt(txtPass.Text);
                usuario.rol_id = Convert.ToInt32(cmbRol.SelectedValue);
                usuario.usuario = txtUsuario.Text;
                usuario.fecha_registro = DateTime.Now;

                int resultado = Usuarios.Add(usuario);
                if (resultado > 0)
                {
                    MessageBox.Show("Los datos se registraron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LimpiarControles();
                }
                else
                {
                    MessageBox.Show("Ocurrio un error al registrar los datos. Intente Nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void ModificarUsuario()
        {
            try
            {
                Loguear UL = new Loguear();

                Usuario usuario = new Usuario();
                usuario.id = usuario_id;
                usuario.activo = Convert.ToInt32(ckbActivo.Checked);
                usuario.apellido = txtApellido.Text;
                usuario.documento = txtDocumento.Text;
                usuario.nombres = txtNombre.Text;
                usuario.password = UL.SHA1Encrypt(txtPass.Text);
                usuario.rol_id = Convert.ToInt32(cmbRol.SelectedValue);
                usuario.usuario = txtUsuario.Text;

                int resultado = Usuarios.Modify(usuario);
                if (resultado > 0)
                {
                    MessageBox.Show("Los datos se modificaron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LimpiarControles();
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Ocurrio un error al modificar los datos. Intente Nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void LimpiarControles()
        {
            txtUsuario.Text = string.Empty;
            txtPass.Text = string.Empty;
            txtNombre.Text = string.Empty;
            txtDocumento.Text = string.Empty;
            txtApellido.Text = string.Empty;
            cmbRol.SelectedIndex = 0;
            ckbActivo.CheckState = CheckState.Unchecked;
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
